import java.io.*;
import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String a = in.next();
        String b = in.next();
        int n = a.length();
        int m = b.length();
        int[][] dp = new int[n+1][m+1];
        for(int i = 0;i <= n;i++)dp[i][0] = i;
        for(int i = 0;i <= m;i++)dp[0][i] = i;
        a = " " + a;
        b = " " + b;
        for(int i = 1;i <= n;i++){
            for(int j = 1;j <= m;j++){
                if(a.charAt(i) == b.charAt(j)){
                    dp[i][j] = dp[i - 1][j - 1];
                }else{
                    dp[i][j] = Math.min(Math.min(dp[i - 1][j - 1],dp[i - 1][j]),dp[i][j - 1]) + 1;
                }
            }
        }
        System.out.println(dp[n][m]);
    }
//    public static int LIS (int[] a) {
//        // write code here
//        int[] dp = new int[100010];
//        int ret = 0;
//        for(int x : a){
//            if(ret == 0 || dp[ret] < x){
//                dp[++ret] = x;
//            }else{
//                int left = 0,right = ret;
//                while(left < right){
//                    int mid = (right + left) / 2;
//                    if(dp[mid] >= x)right = mid;
//                    else left = mid + 1;
//                }
//                dp[right] = x;
//            }
//        }
//        return ret;
//    }
//
//    public static void main(String[] args) {
//        int[] a = {1,6,4,7,5,3,2};
//        System.out.println(LIS(a));
//    }
//    public int minmumNumberOfHost (int n, int[][] startEnd)
//    {
//        Arrays.sort(startEnd, (a, b) ->
//        {
//            //return a[0] <= b[0] ? -1 : 1;
//            return a[0] - b[0];
//        });
//        PriorityQueue<Integer> heap = new PriorityQueue<>(); // ⼩根堆
//        heap.offer(startEnd[0][1]);
//        for(int i = 1; i < n; i++)
//        {
//            int a = startEnd[i][0], b = startEnd[i][1];
//            if(a >= heap.peek()) // ⽆重叠
//            {
//                heap.poll();
//                heap.offer(b);
//            }
//            else // 有重叠
//            {
//                heap.offer(b);
//            }
//        }
//        return heap.size();
//    }
//    public static PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
//    public static Read in = new Read();
//    public static int a,b,x1,x2,y1,y2,ret;
//    public static int[] dx = {1,-1,0,0};
//    public static int[] dy = {0,0,1,-1};
//    public static boolean[][] vis;
//    public static char[][] ch;
//    public static void main(String[] args) throws IOException{
//        a = in.nextInt();
//        b = in.nextInt();
//        x1 = in.nextInt()-1;
//        y1 = in.nextInt()-1;
//        x2 = in.nextInt()-1;
//        y2 = in.nextInt()-1;
//        ret = Integer.MAX_VALUE;
//        vis = new boolean[a][b];
//        ch = new char[a][b];
//        for(int i = 0;i < a;i++){
//            ch[i] = in.next().toCharArray();
//        }
//        if(ch[x2][y2] == '*'){
//            System.out.print(-1);
//        }else{
//            vis[x1][y1] = true;
//            dfs(x1,y1,0);
//            System.out.print(ret == Integer.MAX_VALUE ? -1 : ret);
//        }
//    }
//    public static void dfs(int i,int j,int count){
//        if(i == x2 && j == y2){
//            ret = Math.min(ret,count);
//        }
//        for(int k = 0;k < 4;k++){
//            int x = dx[k] + i;
//            int y = dy[k] + j;
//            if(x >= 0 && x < a && y >= 0 && y < b && !vis[x][y] && ch[x][y] != '*'){
//                vis[x][y] = true;
//                dfs(x,y,count+1);
//                vis[x][y] = false;
//            }
//        }
//    }
}
class Read {
    StringTokenizer st = new StringTokenizer("");
    BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));

    String next() throws IOException {
        while (!st.hasMoreTokens()) {
            st = new StringTokenizer(bf.readLine());
        }
        return st.nextToken();
    }

    int nextInt() throws IOException {
        return Integer.parseInt(next());
    }
}

//    public static int[] dx = {1,-1,0,0};
//    public static int[] dy = {0,0,1,-1};
//    public static char[][] ch;
//    public static void main(String[] args) throws IOException {
//        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
//        Scanner in = new Scanner(System.in);
//        int a = in.nextInt();int b = in.nextInt();int x1 = in.nextInt();
//        int y1 = in.nextInt();int x2 = in.nextInt();int y2 = in.nextInt();
//        ch = new char[a][b];
//        for(int i = 0;i < a;i++) {
//            String s = br.readLine();
//            ch[i] = s.toCharArray();
//            System.out.println(new String(ch[i]));
//        }
//            //ch[i] = in.next().toCharArray();
//        Queue<int[]> q = new LinkedList<>();
//        //System.out.println(a + b);
//    }












//    public static void main(String[] args){
//        Scanner in = new Scanner(System.in);
//        int n = in.nextInt();
//        int p = in.nextInt();
//        int[] m = new int[1000010];
//        for(int i = 0;i < n;i++)m[in.nextInt()]++;
//        int left = 0,right = 0,count = 0,ret = 0;
////         for(int i = p + 1;i <= 1000000 - p;i++){
////             if(m[i] == 0)continue;
////             int a = 0;
////             for(int j = i - p;j <= i + p;j++){
////                 a += m[j];
////             }
////             ret = Math.max(ret,a);
////         }
//        for(int i = 1;i <= 1 + 2 * p;i++)ret += m[i];
//        for(int i = 2 + 2 * p ;i <= 1000000;i++){
//            ret = Math.max(ret,ret - m[i - 2 * p - 1] + m[i]);
//        }
//        System.out.print(ret);
//    }
